package net.htjs.juc.chapter04;

import java.util.ArrayList;

public class TestThreadSafe {

    static final int THREAD_NUMBER = 2;
    static final int LOOP_NUMBER = 200;

    public static void main(String[] args) {
        ThreadSafe test = new ThreadSafe();
        for (int i = 0; i < THREAD_NUMBER; i++) {
            new Thread(() -> {
                test.method1(LOOP_NUMBER);
            }, "Thread-" + (i +1)).start();
        }
    }


    static class ThreadUnsafe {
        //共享成员变量
        ArrayList<String> list = new ArrayList<>();

        public void method1(int loopNumber) {
            for(int i = 0; i < loopNumber; i++) {
                //临界区，会产生竟态条件
                method2();
                method3();
            }

        }

        private void method2() {
            list.add("1");
        }

        private void method3() {
            list.remove(0);
        }

    }

    static class ThreadSafe {
        public void method1(int loopNumber) {
            ArrayList<String> list = new ArrayList<>();
            for(int i = 0; i < loopNumber; i++) {
                //临界区，会产生竟态条件
                method2(list);
                method3(list);
            }
        }

        private void method2(ArrayList<String> list) {
            list.add("1");
        }

        private void method3(ArrayList<String> list) {
            list.remove(0);
        }

    }

}
